package com.test.resource;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * 实现了Resource接口的URL资源类，用于处理URL相关的资源操作
 */
public class UrlResource implements Resource{

    // URL资源的URL对象
    private final URL url;

    /**
     * 构造函数，使用URL对象初始化
     * @param url URL资源的URL对象，不能为空
     * @throws IllegalArgumentException 如果提供的URL为空，则抛出此异常
     */
    public UrlResource(URL url) {
        if (url == null){
            throw new IllegalArgumentException("URL不能为空");
        }
        this.url = url;
    }

    /**
     * 构造函数，使用URL字符串初始化
     * @param url URL资源的字符串表示，不能为空
     * @throws MalformedURLException 如果提供的URL字符串格式不正确，则抛出此异常
     * @throws IllegalArgumentException 如果提供的URL为空字符串，则抛出此异常
     */
    public UrlResource(String url) throws MalformedURLException {
        if (url == null){
            throw new IllegalArgumentException("URL不能为空");
        }
        this.url = new URL(url);
    }

    /**
     * 判断URL资源是否存在
     * @return 如果资源存在返回true，否则返回false
     */
    @Override
    public boolean exists() {
        try{
            URLConnection con = this.url.openConnection();
            if (con instanceof HttpURLConnection) {
                HttpURLConnection httpCon = (HttpURLConnection) con;
                httpCon.setRequestMethod("HEAD");
                int code = httpCon.getResponseCode();
                return (code >= 200 && code < 300);
            }
            // 对于非HTTP URL，尝试获取输入流
            try (InputStream is = con.getInputStream()) {
                return true;
            }
        }catch (IOException ex){
            return false;
        }
    }

    /**
     * 判断URL资源是否可读
     * @return 总是返回true，表示资源可读
     */
    @Override
    public boolean isReadable() {
        return true;
    }

    /**
     * 获取URL资源的输入流
     * @return URL资源的输入流对象
     * @throws Exception 如果无法获取输入流，则抛出此异常
     */
    @Override
    public InputStream getInputStream() throws Exception {
        URLConnection con = this.url.openConnection();
        try {
            return con.getInputStream();
        } catch (IOException ex) {
            // 如果是HTTP连接，尝试断开连接
            if (con instanceof HttpURLConnection) {
                ((HttpURLConnection) con).disconnect();
            }
            throw ex;
        }
    }

    /**
     * 获取URL资源的描述信息
     * @return URL资源的描述字符串
     */
    @Override
    public String getDescription() {
        return "URL资源 ["  + this.url + "]";
    }

    /**
     * 获取URL资源的URL对象
     * @return URL资源的URL对象
     */
    public URL getURL() {
        return this.url;
    }

    /**
     * 重写equals方法，用于比较两个UrlResource对象是否相等
     * @param obj 要比较的另一个对象
     * @return 如果两个对象相等返回true，否则返回false
     */
    public boolean equals(Object obj) {
        if (this == obj){
            return true;
        }
        if (!(obj instanceof UrlResource)){
            return false;
        }
        return this.url.equals(((UrlResource) obj).url);
    }

    /**
     * 重写hashCode方法，用于获取UrlResource对象的哈希码
     * @return UrlResource对象的哈希码
     */
    public int hashCode() {
        return this.url.hashCode();
    }
}
